﻿using System;
using System.Collections.Generic;
using Enterprise.Infrastructure.Entity;
using System.Data.SqlClient;
using System.Data;

namespace Enterprise.Infrastructure.Repository
{
   public class CredencialProvider : Provider<EntidadeCredencial>
    {
       /// <summary>
       /// Cria uma credencial no Banco de dados e retorna o Passaporte Criado
       /// </summary>
       /// <param name="objeto"></param>
       /// <returns></returns>
       public Guid Criar(EntidadeCredencial objeto) 
       {
           using (SqlConnection cn = new SqlConnection(this.ConnectionString))
           {
               SqlCommand cmd = new SqlCommand("CredencialCriar", cn);
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.Parameters.Add("@DataGeracao", SqlDbType.DateTime).Value = objeto.DataDeGeracao;
               cmd.Parameters.Add("@DataExpiracao", SqlDbType.DateTime).Value = objeto.DataExpiracao;
               cmd.Parameters.Add("@Origem", SqlDbType.NVarChar).Value = objeto.Origem;
               cmd.Parameters.Add("@Usuario", SqlDbType.NVarChar).Value = objeto.Usuario;
               cmd.Parameters.Add("@Passaporte", SqlDbType.UniqueIdentifier).Direction = ParameterDirection.Output;
               cn.Open();
               int ret = ExecuteNonQuery(cmd);
               return (Guid)cmd.Parameters["@Passaporte"].Value;
           }
       }


       /// <summary>
       /// Método Não Implementado.
       /// </summary>
       /// <param name="objeto"></param>
       /// <returns></returns>
        public override long Criar(EntidadeCredencial objeto)
        {
            throw new NotImplementedException();
        }

       /// <summary>
       /// Apaga uma Credencial do Banco de Dados.
       /// </summary>
       /// <param name="passaporte"></param>
       /// <returns></returns>
        public  bool Apagar(Guid passaporte)
        {
            using (SqlConnection cn = new SqlConnection(this.ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("CredencialApagar", cn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@Passaporte", SqlDbType.UniqueIdentifier).Value = passaporte;
                cn.Open();
                int ret = ExecuteNonQuery(cmd);
                return (ret == 1);
            }
        }

       /// <summary>
       /// Método não implementado. Não Utilizar!.
       /// </summary>
       /// <param name="Id"></param>
       /// <returns></returns>
        public override bool Apagar(long Id) 
        {
            throw new NotImplementedException();
        }

       /// <summary>
       /// Atualiza uma credencial Armazenada no Banco de dados.
       /// </summary>
       /// <param name="objeto"></param>
       /// <returns></returns>
        public override bool Atualizar(EntidadeCredencial objeto)
        {
            using (SqlConnection cn = new SqlConnection(this.ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("AtualizarCredencial", cn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@DataGeracao", SqlDbType.DateTime).Value = objeto.DataDeGeracao;
                cmd.Parameters.Add("@DataExpiracao", SqlDbType.DateTime).Value = objeto.DataExpiracao;
                cmd.Parameters.Add("@Origem", SqlDbType.NVarChar).Value = objeto.Origem;
                cmd.Parameters.Add("@Usuario", SqlDbType.NVarChar).Value = objeto.Usuario;
                cmd.Parameters.Add("@Passaporte", SqlDbType.UniqueIdentifier).Value = objeto.Passaporte;
                cn.Open();
                int ret = ExecuteNonQuery(cmd);
                return (ret == 1);
            }
        }

       /// <summary>
       /// Retorna uma credencial específica atráves do passaporte recebido.
       /// </summary>
       /// <param name="passaporte"></param>
       /// <returns></returns>
        public EntidadeCredencial ObterPorId(Guid passaporte) 
        {
            using (SqlConnection cn = new SqlConnection(this.ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("ObterPorIdCredencial", cn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@Passaporte", SqlDbType.UniqueIdentifier).Value = passaporte;
                cn.Open();
                IDataReader reader = ExecuteReader(cmd, CommandBehavior.SingleRow);
                if (reader.Read())
                    return PreencherObjeto(reader);
                else
                    return null;
            }
        
        }

       /// <summary>
       /// Método não implementado. Não Utilizar.
       /// </summary>
       /// <param name="id"></param>
       /// <returns></returns>
        public override EntidadeCredencial ObterPorId(long id)
        {
            throw new NotImplementedException();
        }

       /// <summary>
       /// Retorna o numero de credenciais cadastrada no banco de dados.
       /// </summary>
       /// <returns></returns>
        public override int ObterNumeroDeRegistros()
        {
            using (SqlConnection cn = new SqlConnection(this.ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("ContarCredencial", cn);
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                return (int)ExecuteScalar(cmd);
            }
        }



       /// <summary>
       /// Retorna uma lista contendo as credenciais cadastradas no banco de dados. 
       /// </summary>
       /// <param name="indice"></param>
       /// <param name="tamanhoPagina"></param>
       /// <returns></returns>
        public override List<EntidadeCredencial> ObterRegistros(int indice, int tamanhoPagina)
        {
            using (SqlConnection cn = new SqlConnection(this.ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("ObterListaCredencial", cn);
                cmd.Parameters.Add("@Indice", SqlDbType.Int).Value = indice;
                cmd.Parameters.Add("@TamanhoPagina", SqlDbType.Int).Value = tamanhoPagina;
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                return PreencherListaDeObjetos(ExecuteReader(cmd));
            }
        }



        public override EntidadeCredencial PreencherObjeto(System.Data.IDataReader reader)
        {
            EntidadeCredencial entidadeCredencial = new EntidadeCredencial()
            {
                DataDeGeracao = DateTime.Parse(reader["DataGeracao"].ToString()),
                DataExpiracao = DateTime.Parse(reader["DataExpiracao"].ToString()),
                Origem = reader["Origem"].ToString(),
                Passaporte = (Guid)reader["Passaporte"],
                Usuario = reader["Usuario"].ToString()
            };

            return entidadeCredencial;
        }

    }
}
